package day30;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

// JDBC访问数据库的具体步骤
public class Demo01 {

	public static void main(String[] args) {
		Connection con = null;
		Statement st = null;

		try {
			// 一. 注册驱动
			// 方式1
			// 创建MySQL的驱动对象: com.mysql.jdbc.Driver
			// Driver driver = new Driver();
			// 将驱动对象注册到JDBC的驱动管理器中: java.sql.DriverManager;
			// DriverManager.deregisterDriver(driver);
			// 方式2: 通过反射技术加载数据的驱动类(实际开发中用这种)
			Class.forName("com.mysql.jdbc.Driver");
			// 说明: 关于Driver类所在包
			// MySQL驱动包5.X版本: com.mysql.jdbc.Driver
			// MySQL驱动包6.X版本及以上: com.mysql.cj.jdbc.Driver

			// 二. 通过驱动管理器的静态方法获取数据库连接对象: java.sql.Connection;
			// url: 访问数据库服务的连接地址
			// MySQL的url格式: jdbc:mysql://服务器地址:端口号/库名?连接参数

			// URL: uniform resource locator, 统一资源定位符
			// URI: uniform resource identifier, 统一资源标识符
			// URN: uniform resource name, 统一资源名称

			// 当前主机地址如何表示
			// 1. localhost, 系统层面的本机识别
			// 2. 127.0.0.1, 每块网卡都会有的ip地址, 硬件层面的本机识别
			// 3. 主机在网络上的ip地址, 网络层面的主机识别

			// 常用连接参数, 多个参数之间以"&"连接
			// 1. useUnicode
			//    是否使用unicode编码, true|false
			// 2. characterExcoding
			//    指定字符集, utf8
			// 3. serverTimezone
			//    指定时区, MySQL6.x及以上驱动包必须要加该参数, 否则报错
			//    Asia/Shanghai
			// 4. zeroDateTimeBehavior
			//    JDBC在操作值为0的timestamp类型数据(0000-00-00 00:00:00)时
			//    不能正常处理, 默认会抛异常, 该参数的作用为该情况指定处理策略
			//    1. exception: 默认值, 抛出异常
			//    2. converToNull: 将数据转换为null
			//    3. round: 将日期值变成`0001-01-01 00:00:00`
			//    如果库中使用到timestamp类型字段, 最好加上该参数
			//    如果库中没有使用timestamp类型字段, 可以不加该参数

			String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai";

			// 客户端登录MySQL服务端时的用户名
			String username = "root";

			// 客户端登录MySQL服务端时的密码
			String password = "";
			con = DriverManager.getConnection(url, username, password);

			// 三. 通过连接对象获取状态集对象: java.sql.Statement
			st = con.createStatement();

			// 四. 通过状态集对象执行SQL语句
			String sql = " insert into t_emp(name, salary) values('alice', 1234) ";
			st.executeUpdate(sql);
			// JDBC对数据库的操作分2种: 查询/修改
			// 在JDBC看来, select是query操作
			// insert/update/delete操作都属于update操作, 指的是对表进行update
			System.out.println("success");

			// 如果是查询操作, 在四和五之间还有一步: 对查询结果集的处理

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 五. 在finally中关闭相关资源
			// 资源的关闭顺序: 从后向前关(后获取的对象先关)
			try {
				if (st != null) {
					st.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				try {
					if (con != null) {
						con.close();
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}

	}

}
